#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
HTML链接提取工具
按<!DOCTYPE html>分割多个HTML文档，提取所有锚点链接并保存到href.txt
"""

from bs4 import BeautifulSoup
import os
import re
import sys
from href import href_nice
from urllib.parse import urljoin, urlparse

# ==================== 主要函数 ====================
def get_href(input_file=None):
    """从HTML文件中提取所有href链接并转换为完整URL"""
    
    # ==================== 参数设置 ====================
    if input_file is None:
        # 从命令行获取输入文件名
        if len(sys.argv) > 1:
            input_file = sys.argv[1]
            print(f"从命令行获取输入文件: {input_file}")
        else:
            input_file = "cqut_content.html"  # 默认文件
    else:
        print(f"使用指定输入文件: {input_file}")

    output_file = "href.txt"
    print(f"输出文件: {output_file}")

    # ==================== 文件读取 ====================
    print("\n正在读取输入文件...")

    if not os.path.exists(input_file):
        print(f"错误: 文件 {input_file} 不存在")
        return []

    try:
        with open(input_file, 'r', encoding='utf-8') as f:
            file_content = f.read()
        print(f"成功读取文件，大小: {len(file_content)} 字符")
    except Exception as e:
        print(f"读取文件失败: {e}")
        return []

    # ==================== HTML文档分割 ====================
    print("\n正在分割HTML文档...")

    # 按<!DOCTYPE html>分割多个HTML文档
    html_parts = file_content.split('<!DOCTYPE html>')

    # 第一部分可能是空的或者是其他内容，从第二部分开始处理
    html_documents = []
    for i, part in enumerate(html_parts):
        if i == 0:
            # 第一部分如果不包含html标签就跳过
            if '<html' not in part.lower():
                continue
            html_documents.append(part)
        else:
            # 重新添加DOCTYPE声明
            html_documents.append('<!DOCTYPE html>' + part)

    print(f"发现 {len(html_documents)} 个HTML文档")

    # ==================== 链接提取 ====================
    print("\n正在提取链接...")

    all_links = []

    for i, html_doc in enumerate(html_documents, 1):
        print(f"处理第 {i} 个HTML文档...")
        
        try:
            # 从HTML注释中提取原始URL来确定基础域名
            url_pattern = r'<!-- URL: (https?://[^/]+)'
            url_matches = re.findall(url_pattern, html_doc)
            current_base_url = "https://www.cqut.edu.cn/"  # 默认基础URL
            
            if url_matches:
                # 使用找到的第一个URL作为基础URL
                parsed_url = urlparse(url_matches[0])
                current_base_url = f"{parsed_url.scheme}://{parsed_url.netloc}/"
                print(f"  检测到基础URL: {current_base_url}")
            else:
                print(f"  未找到URL注释，使用默认基础URL: {current_base_url}")
            
            # 使用BeautifulSoup解析HTML
            soup = BeautifulSoup(html_doc, 'html.parser')
            
            # 查找所有带href属性的a标签
            a_tags = soup.find_all('a', href=True)
            
            doc_link_count = 0
            for tag in a_tags:
                href = tag['href'].strip()
                
                # 跳过空链接和锚点链接
                if not href or href.startswith('#'):
                    continue
                
                # 转换为完整URL
                full_url = convert_to_full_url(href, current_base_url)
                
                # 避免重复链接
                if full_url not in all_links:
                    all_links.append(full_url)
                    doc_link_count += 1
            
            print(f"  从文档 {i} 中提取到 {doc_link_count} 个新的唯一链接")
            
        except Exception as e:
            print(f"  处理文档 {i} 时出错: {e}")
            continue

    # ==================== 链接去重和排序 ====================
    print(f"\n正在去重和排序链接...")

    # 去重并排序
    unique_links = list(set(all_links))
    unique_links.sort()

    print(f"总共找到 {len(unique_links)} 个唯一链接")

    # 显示前10个链接作为预览
    print(f"\n前10个链接预览:")
    for i, link in enumerate(unique_links[:10], 1):
        print(f"{i:2d}. {link}")
    if len(unique_links) > 10:
        print(f"... 还有 {len(unique_links) - 10} 个链接")

    # ==================== 读取现有链接 ====================
    print(f"\n正在检查现有的 {output_file} 文件...")

    existing_urls = set()
    if os.path.exists(output_file):
        try:
            with open(output_file, 'r', encoding='utf-8') as f:
                existing_urls = set(line.strip() for line in f if line.strip())
            print(f"从 {output_file} 读取到 {len(existing_urls)} 个已存在的URL")
        except Exception as e:
            print(f"读取 {output_file} 时出错: {e}")
    else:
        print(f"{output_file} 文件不存在，将创建新文件")

    # ==================== 保存新链接 ====================
    print(f"\n正在保存链接到 {output_file}...")

    # 找出需要追加的新URL（去除重复）
    new_urls = [url for url in unique_links if url not in existing_urls]

    if new_urls:
        try:
            with open(output_file, 'a', encoding='utf-8') as f:
                for url in new_urls:
                    f.write(url + '\n')
            print(f"✅ 追加了 {len(new_urls)} 个新URL到 {output_file}")
        except Exception as e:
            print(f"写入 {output_file} 时出错: {e}")
            return []
    else:
        print("没有新的URL需要追加")

    print(f"{output_file} 文件现在总共包含 {len(existing_urls) + len(new_urls)} 个URL")

    print("\n🎉 HTML链接提取完成！")
    
    return unique_links

# ==================== 辅助函数 ====================
def convert_to_full_url(href, base_url):
    """将href转换为完整的URL"""
    # 如果已经是完整的URL（包含协议），直接返回
    if href.startswith(('http://', 'https://')):
        return href
    
    # 如果是其他协议（如mailto, tel等），直接返回
    if ':' in href and not href.startswith('/'):
        return href
    
    # 使用urljoin拼接URL
    full_url = urljoin(base_url, href)
    
    # 确保使用https协议
    if full_url.startswith('http://'):
        full_url = full_url.replace('http://', 'https://', 1)
    
    return full_url

# ==================== 主程序入口 ====================
if __name__ == "__main__":
    print("HTML链接提取工具启动...")
    get_href()
    href_nice()
    